Skip to main content

ユーザー固有のGコード機能

ザル CNC11_CustomFunctions.project サンプルプロジェクトは、のインストールディレクトリにあります。 CODESYS 下に ..\CODESYS SoftMotion\Examples

この例は、Gコードの式で使用する独自の関数を作成する方法を示しています。

Gコードの式と関数の詳細については、以下を参照してください。 .ここには、デフォルトでサポートされているすべての演算子と関数のリストが表示されます。

この例では以下のように定義しています。 SEL IEC 61131-3のオペレータなので、Gコードでも使用できます。

アプリケーションの構造

CNC アプリケーションではよくあることですが、このアプリケーションにはパス処理が含まれます (CNC_PreparePath プログラム) と補間 ()CNC プログラム)。補間は他の例と変わらないため、このトピックについてはここではこれ以上説明しません

パス処理は、低優先度では 20 ミリ秒ごとに周期的に呼び出されます。 PathTask。高優先度では、補間は 4 ミリ秒ごとに周期的に呼び出されます MotionTask。バックグラウンドタスク VISU_TASK ビジュアライゼーション用に定義されています。

ビジュアライゼーションでは、Gコードの処理を開始して変数の値を設定できます $LONGLINE$。G コードと機械の動き (3D ガントリー) がビジュアライゼーションの右側に表示されます

Gコード

CNC

LET #WIDTH : LREAL
N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110)
N20 F50 E100 E-100
N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2
N40 Y-#WIDTH
N50 X-#WIDTH Z-#WIDTH/2
N60 Y#WIDTH
N70 X0 Y0 Z0

1行目:ローカル変数の宣言 #WIDTH タイプの LREAL

2行目、ブロックN10: の値の割り当て SEL($LONGLINE$, 40, 110) 変数に #WIDTH。PLC 変数の値の場合 $LONGLINE$TRUEその場合、式の値は 110 です。それ以外の場合は 40 です。

次の行では、Z 方向にさらに移動した長方形がトラバースされます。長方形の片側の長さは 2*#WIDTH

の実装 SEL ファンクション

_sm_img_function_sel.png

ユーザー定義関数を作成するには、以下を実装する関数ブロックを作成する必要があります。 SMC_NC_IFunction インターフェイス。

詳細については、以下を参照してください。 SMC_NC_IFunction

. このインターフェースは次の 2 つのメソッドを定義します。
  1. GetSignature。戻り値の型、カウント、および関数の引数の型がここに返されます。この例では、 SEL 関数は次の型の値を返します。 T_OTHER と、3 つのタイプの引数があります T_BOOLT_OTHER、および T_OTHERT_OTHER 任意のタイプを表す (いずれか T_BOOLT_LREAL、または T_STRING]。の 3 つの出現すべて T_OTHER 同じタイプでなければなりません。

    METHOD GetSignature
    VAR_OUTPUT
        resultType : SMC_GVar_Type;
        nNumArguments : UDINT;
        pType : POINTER TO SMC_GVar_Type;
    END_VAR
    VAR    argTypes : ARRAY[0..2] OF SMC_GVar_Type :=
            [SMC_GVar_Type.T_BOOL,
             SMC_GVar_Type.T_OTHER,
             SMC_GVar_Type.T_OTHER];
    END_VAR
    
    resultType := SMC_GVAR_Type.T_OTHER;
    nNumArguments := 3;
    pType := ADR(argTypes);
  2. Call: このメソッドは、G コードの処理中に呼び出されます。引数はを介して渡されます pa 入力。エクスプレッション pa[0].argValue.bValue 番目の引数のブール値にアクセスするために使用されます。2 番目の引数の型によって異なります。 pa[1].argType、結果は戻り値です。 result.argType そして CASE ステートメントへの分岐。

    METHOD Call
    VAR_IN_OUT
        result : SMC_NC_GArgument;
    END_VAR
    VAR_INPUT
        pa : POINTER TO SMC_NC_GArgument;
    END_VA
    RVAR_OUTPUT
        eError : SMC_ERROR;
    END_VAR
    VAR
        g : BOOL;
    END_VAR
    
    g := pa[0].argValue.bValue;
    
    result.argType := pa[1].argType;
    
    CASE result.argType OF
    SMC_GVAR_Type.T_BOOL:
        result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue);
    
    SMC_GVAR_Type.T_STRING:
        result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue);
    
    SMC_GVAR_Type.T_LREAL:
        result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue);
    
    ELSE
        eError := SMC_INVALID_PARAMETER;
    END_CASE

の構成 SMC_ReadNCFile2

のインスタンス CNC_Sel ファンクションブロックは、に作成されます。 GVL_CNCFunctions グローバル変数リスト。

配列 aCNCFunctions 長さ 1 は関数ブロックの名前とインスタンスで初期化されます。その後、この配列はテーブル内でリンクされます。 funTable タイプの SMC_NC_GFunctionTable

aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction :=
    [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)];

funTable : SMC_NC_GFunctionTable :=
    (numFunctions:= 1,     pFunction:= ADR(aCNCFunctions)) ;

最後に、このテーブルはに渡されます SMC_ReadNCFile2 ファンクションブロック:

rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE);

[...]

rncf2(
    bExecute:= TRUE,
    sFileName:= sFileName,
    pCustomFunTable:= ADR(funTable),
    pvl:= ADR(varList));

コミッショニング

  1. アプリケーションをビルドし、コントローラーにダウンロードします。

  2. アプリケーションを起動し、ビジュアライゼーションに切り替えて、を押します StartLongline 変数の値を設定するラジオボタン $LONGLINE$ Gコードで TRUE または FALSE